#include "types.hpp"
#include "system.hpp"
#include "vga.hpp"

void crash(){
    const char * format = "#47 EAX=%X EBX=%X ECX=%X EDX=%X ESI=%X EDI=%X  ";
    asm volatile("mov %[x],0; mov %[y],24;":[x]"=m"(vga::cursor_x),[y]"=m"(vga::cursor_y));
    asm volatile("push edi; push esi; push edx; push ecx; push ebx; push eax;");
    asm volatile(
        "push %[format];"
        "call %[vga_printf];"
        ::
        [format]     "g" (format),
        [vga_printf] "r" ((dword)vga::printf)
    );

    const char * x =
        "                            I'm really sorry, but...                            "
        "--------------------------------------------------------------------------------"
        "-@@@--@@@--@@@---@@@@@@@@----@@@@@@@@---@@@@@@@--------------@@@@@@----@@@@@@---"
        "-@@@--@@@--@@@--@@@@@@@@@@--@@@@@@@@@@--@@@@@@@-------------@@@@@@@@--@@@@@@@---"
        "-@@#--@@#--@@#--@@#---@@@@--@@#---@@@@----@@#---------------@@#--@@@--#@@-------"
        "-#@#--#@#--#@#--#@#--@#@#@--#@#--@#@#@----#@#---------------#@#--@#@--#@#-------"
        "-@##--##@--@#@--@#@-@#-#@#--@#@-@#-#@#----@##----@#@#@#@#@--@#@--#@#--##@@##----"
        "-#@#--###--#@#--#@###--###--#@###--###----###----###@#@###--#@#--###---##@###---"
        "-##@--##@--##@--##@#---###--##@#---###----##@---------------##@--###-------#@#--"
        "-@#@--@#@--@#@--@#@----#@#--@#@----#@#----@#@---------------@#@--#@#------#@#---"
        "--@@@@-@@-@@@---@@@@@@@-@@--@@@@@@@-@@-----@@---------------@@@@@-@@--@@@@-@@---"
        "---@@-@--@-@-----@-@-@--@----@-@-@--@------@-----------------@-@--@---@@-@-@----"
        "--------------------------------------------------------------------------------"
        "-------@@@@@@@--@@@@@@@----@@@@@@----@@@@@@---@@@--@@@--@@@@@@@@--@@@@@@@-------"
        "------@@@@@@@@--@@@@@@@@--@@@@@@@@--@@@@@@@---@@@--@@@--@@@@@@@@--@@@@@@@@------"
        "------#@@-------@@#--@@@--@@#--@@@--#@@-------@@#--@@@--@@#-------@@#--@@@------"
        "------#@#-------#@#--@#@--#@#--@#@--#@#-------#@#--@#@--#@#-------#@#--@#@------"
        "------#@#-------@#@##@#---@#@#@#@#--##@@##----@#@#@#@#--@###@#----@#@--#@#------"
        "------###-------##@#@#----###@####---##@###---###@####--#####@----#@#--###------"
        "------@##-------##@-@##---##@--###-------#@#--##@--###--##@-------##@--###------"
        "------@#@-------@#@--#@#--@#@--#@#------#@#---@#@--#@#--@#@-------@#@--#@#------"
        "-------@@@-@@@--@@---@@@--@@---@@@--@@@@-@@---@@---@@@---@@-@@@@---@@@@-@@------"
        "-------@@-@@-@---@---@-@---@---@-@--@@-@-@-----@---@-@--@-@@-@@---@@-@--@-------"
        "--------------------------------------------------------------------------------";

    asm volatile("mov %[x],0; mov %[y],0;":[x]"=m"(vga::cursor_x),[y]"=m"(vga::cursor_y));
    while(*x != '\0'){
        switch(*x){
            case '@': vga::color = 0x04; vga::putchar('\xDB'); break;
            case '#': vga::color = 0x08; vga::putchar('\xDB'); break;
            case '-': vga::color = 0x00; vga::putchar('\xDB'); break;
            default:  vga::color = 0x4f; vga::putchar(*x);
        }
        x++;
    }

    system::halt();
}


